package com.itheima.demo03;

import com.sun.jdi.Value;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.*;

/**
 * @author Zhang_Han
 * @version 1.0
 * @date 2020/7/14 18:46
 */
public class Work_001 {
    static FileInputStream fis;
    static FileOutputStream fos;

    public static void main(String[] args) {

        ArrayList<String> list = new ArrayList<>();
        list.add("C:\\Users\\97622\\Desktop\\ROBIN\\day16.md");
        list.add("C:\\Users\\97622\\Desktop\\ROBIN\\day18.md");
        list.add("C:\\Users\\97622\\Desktop\\ROBIN\\day15.md");
        list.add("C:\\Users\\97622\\Desktop\\ROBIN\\day17.md");
        list.add("C:\\Users\\97622\\Desktop\\ROBIN\\day19.md");
        /*使用多线程完成文件拷贝要求：
        1. 使用线程池实现
        2. 将文件拷贝到 `D:\\robin` 文件夹
        3. 每个线程拷贝一个文件
        4. 当所有文件拷贝完毕后输出文件拷贝完毕
        5. 使用双列集合记录文件拷贝信息（键用来存储文件名，值用来存储拷贝完成的时间串）
         */
        //创建一个线程池;
        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2,
                3,
                5,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
        //将文件拷贝到 `D:\\robin` 文件夹
        //每个线程拷贝一个文件
        tpe.submit(new Runnable() {
            @Override
            public void run() {
                //需要执行的代码;
                //首先创建字符输入流;
                synchronized (this) {
                    for (int i = 0; i < list.size(); i++) {
                        String filePath = list.get(i);
                        try {
                            File file = new File(filePath);
                            String name = file.getName();
                            fis = new FileInputStream(file);
                            fos = new FileOutputStream("E:\\copy\\"+name);
                            byte[] arr = new byte[1024];
                            int len;
                            for (int i1 = 0; i1 < 5; i1++) {
                                while ((len = fis.read(arr)) != -1) {
                                    fos.write(arr, 0, len);
                                }
                            }
                            fis.close();
                            fos.close();
                            //当所有文件拷贝完毕后输出文件拷贝完毕
                            //使用双列集合记录文件拷贝信息（键用来存储文件名，值用来存储拷贝完成的时间串）
                            System.out.println("文件传输完毕!");
                            ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
                            Date date = new Date();
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                            String nowDate = sdf.format(date);
                            for (int i1 = 0; i1 < list.size(); i1++) {
                                String s = list.get(i);
                                map.put(s, nowDate);
                            }
                            ConcurrentHashMap.KeySetView<String, String> keys = map.keySet();
                            for (String key : keys) {
                                String value = map.get(key);
                                System.out.println("文件名"+key + ";时间:" + value);
                            }
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        });

        tpe.shutdown();
    }

}
